package com.g4.shoppingsingle.config;

import com.g4.shoppingsingle.service.impl.DdUsersInfoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

// 表示当前配置类是配置Spring框架的
@Configuration
//// 启动Spring-Security提供的权限管理功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //当前类继承WebSecurityConfigurerAdapter
    // 能够重写这个父类中的方法,这个父类中的方法都是用于设置权限管理的

    @Autowired
    private DdUsersInfoServiceImpl ddUsersInfoService;


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(ddUsersInfoService);
    }

    /**
     * 定义无需权限就可以访问的页面、接口、资源（js\css\image）
     * 定义需要登录之后才能访问的页面、接口
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()//禁用防跨域攻击功能
                .authorizeRequests()// 设置网站的访问及放行规则
                // 下面的方法开始指定路径
                .antMatchers(
                        "/", //首页
                        "/css/**",
                        "/js/**",
                        "/image/**",
                        "/views/register",   //注册页面
                        "/register",          //注册的后台接口
                        "/views/login",      //登录页面
                        "/login",            //登录的后台接口
                        "/shoppingsingle/ddCategorysInfo/list",//获取分类列表
                        "/returnUrl",
                        "/shoppingsingle/ddUsersInfo/me"
                )
                .permitAll() // 上面的路径是全部允许的(不需要登录就能访问)
                .anyRequest() // 除上面之外的其他路径
                .authenticated() // 需要登录才能访问
                .and()  //上面的配置完成了,开始配置下面的
                .formLogin() // 使用表单进行登录
                .loginPage("/views/login") //配置登录时显示的页面
                .loginProcessingUrl("/login") //配置处理登录的路径
                .failureUrl("/views/login") // 登录失败跳转的页面
                .defaultSuccessUrl("/")// 登录成功跳转的页面
                .and()
                .logout()
                .logoutUrl("/logout") // 配置登出的链接
                .logoutSuccessUrl("/views/login");// 登出后跳转回登录页
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
